-- Lua Battle System - 物品基类

local Logger = require("utils.logger")

local Item = {
    -- 物品基本信息
    id = "",
    name = "",
    description = "",
    type = "", -- consumable, equipment, key_item
    
    -- 物品属性
    rarity = "common", -- common, uncommon, rare, epic, legendary
    value = 0, -- 物品价值
    stackable = false, -- 是否可堆叠
    max_stack = 1, -- 最大堆叠数量
    
    -- 使用相关
    usable_in_battle = true, -- 是否可在战斗中使用
    usable_out_of_battle = true, -- 是否可在战斗外使用
    
    -- 物品效果
    effects = {},
    
    -- 物品状态
    is_equipped = false,
    quantity = 1
}

-- 物品构造函数
function Item:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

-- 初始化物品
function Item:init()
    self.is_equipped = false
    self.quantity = 1
    Logger.debug("物品初始化完成: " .. self.name)
end

-- 检查物品是否可用
function Item:is_usable(context)
    context = context or "battle" -- battle, world
    
    if context == "battle" and not self.usable_in_battle then
        Logger.warn(self.name .. " 无法在战斗中使用")
        return false
    end
    
    if context == "world" and not self.usable_out_of_battle then
        Logger.warn(self.name .. " 无法在战斗外使用")
        return false
    end
    
    return true
end

-- 使用物品
function Item:use(user, target)
    if not self:is_usable("battle") then
        return false
    end
    
    Logger.info(user.name .. " 使用了 " .. self.name)
    
    -- 应用物品效果
    local result = self:apply_effects(user, target)
    
    return result
end

-- 应用物品效果
function Item:apply_effects(user, target)
    local result = {
        success = true,
        effects_applied = {}
    }
    
    -- 默认空实现，子类重写
    
    return result
end

-- 装备物品
function Item:equip(user)
    if self.type ~= "equipment" then
        Logger.warn(self.name .. " 不是装备物品")
        return false
    end
    
    -- 调用装备逻辑
    local success = user:equip_item(self)
    if success then
        self.is_equipped = true
        Logger.info(user.name .. " 装备了 " .. self.name)
    end
    
    return success
end

-- 卸下装备
function Item:unequip(user)
    if self.type ~= "equipment" then
        Logger.warn(self.name .. " 不是装备物品")
        return false
    end
    
    -- 调用卸下逻辑
    local success = user:unequip_item(self.equipment_slot)
    if success then
        self.is_equipped = false
        Logger.info(user.name .. " 卸下了 " .. self.name)
    end
    
    return success
end

-- 装备时的效果
function Item:on_equip(user)
    -- 默认空实现，子类重写
end

-- 卸下时的效果
function Item:on_unequip(user)
    -- 默认空实现，子类重写
end

-- 获取物品状态
function Item:get_state()
    return {
        id = self.id,
        name = self.name,
        type = self.type,
        rarity = self.rarity,
        value = self.value,
        stackable = self.stackable,
        max_stack = self.max_stack,
        quantity = self.quantity,
        is_equipped = self.is_equipped
    }
end

-- 导出模块
return Item